package com.nathan.crm.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nathan.base.BaseService;
import com.nathan.crm.dao.SaleChanceMapper;
import com.nathan.crm.enums.DevResult;
import com.nathan.crm.enums.StateStatus;
import com.nathan.crm.query.SaleChanceQuery;
import com.nathan.crm.utils.AssertUtil;
import com.nathan.crm.utils.PhoneUtil;
import com.nathan.crm.vo.SaleChance;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class SaleChanceService extends BaseService<SaleChance,Integer> {

    @Resource
    private SaleChanceMapper saleChanceMapper;

    /**
     * 多条件分页查询营销机会
     * @param saleChanceQuery
     * @return
     */
    public Map<String,Object> querySaleChanceByParams(SaleChanceQuery saleChanceQuery){
        Map<String, Object> map = new HashMap<>();

        //开启分页
        PageHelper.startPage(saleChanceQuery.getPage(),saleChanceQuery.getLimit());
        //得到对应的分页对象
        PageInfo<SaleChance> pageInfo = new PageInfo<>(selectByParams(saleChanceQuery));

        //设置map对象
        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        //设置分页好的列表
        map.put("data",pageInfo.getList());

        return map;
    }

    /**
     * 添加营销机会
     *             1、参数校验
     *                 customerName客户名称    非空
     *                 linkMan联系人          非空
     *                 linkPhone联系号码      非空，手机号码格式正确
     *
     *             2、设置相关参数的默认值
     *                 createMan创建人        当前登录用户名
     *                 assignMan指派人
     *                     如果未设置指派人(默认)
     *                         state分配状态(0=未分配,1=已分配)
     *                             0=未分配
     *                         assignTime指派时间
     *                             设置为null
     *                         devResult开发状态(0=未开发，1=开发中，2=开发成功，3=开发失败)
     *                             0=未开发(默认)
     *                     如果设置了指派人
     *                         state分配状态(0=未分配,1=已分配)
     *                             1=已分配
     *                         assignTime指派时间
     *                             系统当前时间
     *                         devResult开发状态(0=未开发，1=开发中，2=开发成功，3=开发失败)
     *                             1=开发中
     *                 isValid是否有效(0=无效,1=有效)
     *                     设置为有效1=有效
     *                 createDate创建时间
     *                     默认是系统当前时间
     *                 updateDate
     *                     默认是系统当前时间
     *             3。执行添加操作，判断受影响的行数
     * @param saleChance
     */
    @Transactional
    public void addSaleChance(SaleChance saleChance){
        /* 1、参数校验 */
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());
        /* 2、设置相关参数的默认值 */
        // isValid是否有效(0=无效,1=有效) 1=有效
        saleChance.setIsValid(1);
        //createDate创建时间 默认是系统当前时间
        saleChance.setCreateDate(new Date());
        //updateDate 默认是系统当前时间
        saleChance.setUpdateDate(new Date());

        if (StringUtils.isBlank(saleChance.getAssignMan())){
            // 如果指派人为空，表示未分配指派人
            // state分配状态(0=未分配,1=已分配) 0=未分配
            saleChance.setState(StateStatus.UNSTATE.getType());
            // assignTime指派时间 设置为null
            saleChance.setAssignTime(null);
            // devResult开发状态(0=未开发，1=开发中，2=开发成功，3=开发失败) 0=未开发(默认)
            saleChance.setDevResult(DevResult.UNDEV.getStatus());
        }else {
            // 如果指派人不为空，表示分配了指派人
            // state分配状态(0=未分配,1=已分配) 1=已分配
            saleChance.setState(StateStatus.STATED.getType());
            // assignTime指派时间 系统当前时间
            saleChance.setAssignTime(new Date());
            // devResult开发状态(0=未开发，1=开发中，2=开发成功，3=开发失败) 1=开发中
            saleChance.setDevResult(DevResult.DEVING.getStatus());
        }

        /* 3。执行添加操作，判断受影响的行数 */
        AssertUtil.isTrue(saleChanceMapper.insertSelective(saleChance) != 1,"添加数据失败！");
    }

    /**
     * 更新营销机会
     *         1。参数校验
     *             营销机会ID      非空,数据库中对应的记录存在
     *             customerName客户名称    非空
     *             linkMan联系人  非空
     *             linkPhone联系号码    非空，手机号码格式正确
     *         2，设置相关参数的默认值
     *             updateDate更新时间  设置为系统当时时间
     *             assignMan指派人
     *                 原始数据未设置
     *                     修改后未设置
     *                         不需要操作
     *                     修改后已设置
     *                         assignTime指派时间  设置为系统当前时间
     *                         分配状态    1=已分配
     *                         开发状态    1=开发中
     *                 原始数据已设置
     *                     修改后未设置
     *                         assignTime指派时间  设置为null
     *                         分配状态    0=未分配
     *                         开发状态    0=未开发
     *                     修改后已设置
     *                         判断修改前后是否是同一个指派人
     *                             如果是,则不需要操作
     *                             如果不是,则需要更新assignTime指派时间    设置为系统当前时间
     *         3。执行更新操作,判断受影响的行数
     * @param saleChance
     */
    @Transactional
    public void updateSaleChance(SaleChance saleChance){
        /* 1、参数校验 */
        //营销机会ID      非空,数据库中对应的记录存在
        AssertUtil.isTrue(saleChance.getId() == null,"要更新的数据不存在！");
        SaleChance temp = saleChanceMapper.selectByPrimaryKey(saleChance.getId());
        AssertUtil.isTrue(temp == null,"要更新的数据不存在！");

        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());

        /* 设置相关参数的默认值 */
        // updateDate更新时间  设置为系统当时时间
        saleChance.setUpdateDate(new Date());

        if (StringUtils.isBlank(temp.getAssignMan())){
            // 指派人原始数据为空
            if (!StringUtils.isBlank(saleChance.getAssignMan())){
                //添加指派人
                saleChance.setAssignTime(new Date());
                saleChance.setState(StateStatus.STATED.getType());
                saleChance.setDevResult(DevResult.DEVING.getStatus());
            }
        }else {
            //指派人原始数据不为空
            if (StringUtils.isBlank(saleChance.getAssignMan())){
                //取消指派人
                saleChance.setState(StateStatus.UNSTATE.getType());
                saleChance.setDevResult(DevResult.UNDEV.getStatus());
                saleChance.setAssignTime(null);
            }else {
                if (saleChance.getAssignMan().equals(temp.getAssignMan())){
                    // 指派人一样
                    saleChance.setAssignTime(temp.getAssignTime());
                }else {
                    //指派人不一样
                    saleChance.setAssignTime(new Date());
                }
            }
        }

        /* 3。执行更新操作,判断受影响的行数 */
        AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance) != 1,"更新失败！");
    }

    /**
     * 多记录删除
     * @param ids
     */
    @Transactional
    public void deleteSaleChance(Integer[] ids){
        //判断ids是否为空
        AssertUtil.isTrue(ids == null || ids.length < 1,"请选择要删除的记录！");

        AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids) != ids.length,"删除失败！");
    }

    /**
     * 参数校验
     * @param customerName
     * @param linkMan
     * @param linkPhone
     */
    private void checkSaleChanceParams(String customerName, String linkMan, String linkPhone) {
        //customerName客户名称    非空
        AssertUtil.isTrue(StringUtils.isBlank(customerName),"客户名称不能为空！");
        //linkMan联系人          非空
        AssertUtil.isTrue(StringUtils.isBlank(linkMan),"联系人不能为空！");
        //linkPhone联系号码      非空
        AssertUtil.isTrue(StringUtils.isBlank(linkPhone),"联系电话不能为空！");
        // 手机号码格式正确
        AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone),"手机号格式错误！");
    }

    /**
     * 根据id更新营销机会的开发状态
     * @param id
     * @param devResult
     */
    public void updateSaleChanceDevResult(Integer id, Integer devResult) {
        // 判断id是否为空
        AssertUtil.isTrue(null == id,"数据错误！");

        //根据id获取营销机会对象
        SaleChance saleChance = saleChanceMapper.selectByPrimaryKey(id);
        //判断对象是否为空
        AssertUtil.isTrue(saleChance == null,"数据不存在！");

        //设置对象的开发状态
        saleChance.setDevResult(devResult);

        //更新数据
        saleChanceMapper.updateByPrimaryKeySelective(saleChance);
    }

}
